package com.alpha.schema;

import com.alpha.core.utils.StringUtil;
import com.google.common.collect.ImmutableMap;

import javax.annotation.Nullable;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 元数据数据类型关系定义
 *
 * @author chenruwan
 * @since 2022-01-01
 */
public class SchemaType {
    private SchemaType() {
    }

    public static final Map<String, String> BUILDING_IN_TYPES = ImmutableMap.<String, String>builder()
            // 特化为 Bool
            .put("tinyint(1)", Boolean.class.getSimpleName())
            // 1 字节
            .put("tinyint", Integer.class.getSimpleName())
            // 2 字节
            .put("smallint", Integer.class.getSimpleName())
            // 4 字节
            .put("int", Integer.class.getSimpleName())
            // 8 字节
            .put("bigint", Long.class.getSimpleName())
            // 4 字节
            .put("float", Float.class.getSimpleName())
            // 8 字节
            .put("double", Double.class.getSimpleName())
            // 定长字符串(0-255)
            .put("char(*)", String.class.getSimpleName())
            // 变长字符串(0-65535)
            .put("varchar(*)", String.class.getSimpleName())
            // 文本串, 最大长度2^16-1
            .put("text", String.class.getSimpleName())
            // 最大长度2^24-1
            .put("mediumtext", String.class.getSimpleName())
            // 最大长度2^32-1
            .put("longtext", String.class.getSimpleName())
            // 默认format设置成yyyy-MM-dd
            .put("date", Date.class.getSimpleName())
            // 默认format设置成yyyy-MM-dd HH:mm:ss
            .put("datetime", Date.class.getSimpleName())
            // 默认format设置成HH:mm:ss
            .put("time", Date.class.getSimpleName())
            // json对象
            .put("json", Object.class.getSimpleName())
            // list对象，默认是对Id使用list
            .put("list", "List<Long>")
            .put("list<string>", "List<String>")
            .build();

    public static String toJavaType(String type) {
        return StringUtil.nullToDefault(findType(type), String.class.getSimpleName());
    }

    public static String toSqlType(String type) {
        if (type.startsWith(List.class.getSimpleName().toLowerCase())) {
            return "json";
        }
        if (SchemaType.isBuildingInType(type)) {
            return type;
        } else {
            // 枚举键的长度限制为 16
            return "varchar(16)";
        }
    }

    public static boolean isBuildingInType(String type) {
        return findType(type) != null;
    }

    @Nullable
    private static String findType(String type) {
        for (var entry : BUILDING_IN_TYPES.entrySet()) {
            String key = entry.getKey();
            if (key.equals(type)) {
                return entry.getValue();
            }
            if (key.contains("(*)") && type.contains("(")
                    && key.substring(0, key.indexOf('(')).equals(type.substring(0, type.indexOf('(')))) {
                return entry.getValue();
            }
        }
        return null;
    }
}
